package com.dragon.datastructure.sort;

/**
 * 基数排序
 *
 * @author dragon
 * @since 2019/12/26
 */
public class RatioSort {

    public static void main(String[] args) {
        //800万的数据基数排序耗费的时间:476毫秒
        int[] array = new int[8_000_000];
        for (int i = 0; i < array.length; i++) {
            array[i] = (int) (Math.random() * 800_000);
        }
        long startTime = System.currentTimeMillis();
        sort(array);
        long entTime = System.currentTimeMillis();
        System.out.println("基数排序序耗费的时间:" + (entTime - startTime) + "毫秒");
    }


    /**
     * 基数排序
     *
     * @param array
     */
    public static void sort(int[] array) {
        if (array == null || array.length < 2) {
            return;
        }
        // 创建一个二维数组(桶)
        int[][] bucket = new int[10][array.length];
        // 创建一个一维数组(记录每个桶里面的元素个数) 例如 bucket[0] 的元素个数 为 bucketElementCount[0]
        int[] bucketElementCount = new int[10];
        // 获得array中最大的元素的元素的位数
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        // 获得最大的元素的位数
        int maxLength = (max + "").length();
        for (int j = 0, n = 1; j < maxLength; j++, n *= 10) {
            for (int i = 0; i < array.length; i++) {
                // 取出每个元素对应位的值
                int digitOfElement = array[i] / n % 10;
                bucket[digitOfElement][bucketElementCount[digitOfElement]] = array[i];
                bucketElementCount[digitOfElement]++;
            }
            int index = 0;
            for (int i = 0; i < bucket.length; i++) {
                // 判断对应的bucket中的元素个数是否大于 0
                if (bucketElementCount[i] > 0) {
                    for (int k = 0; k < bucketElementCount[i]; k++) {
                        array[index++] = bucket[i][k];
                    }
                }
                // 清除bucket对应的元素个数的值
                bucketElementCount[i] = 0;
            }
        }
    }
}
